﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Sinacor.Infra.UI.Controls.SmartClient; 
using Sinacor.UI.Bovespa.Contabil.Presenter;

namespace Sinacor.UI.Bovespa.Contabil.View.SmartClient
{
    public partial class CadastroDespesaNota : SinacorWindow, ICadastroDespesaNota
    {
        public Presenter.CadastroDespesaNota cadastroDespesaNotaPresenter { get; set; }

        public CadastroDespesaNota()
        {
            InitializeComponent();
            this.cadastroDespesaNotaPresenter = new Sinacor.UI.Bovespa.Contabil.Presenter.CadastroDespesaNota(this);
            this.DataContext = this.cadastroDespesaNotaPresenter;

            dtgTipodespesa.NewItemType = typeof(Model.TipoDespesa);
            dtgDespesasNota.NewItemType = typeof(Model.DespesaNota);

            this.AfterInitialize += new RoutedEventHandler(CadastroDespesaNota_AfterInitialize);
        }

        private void CadastroDespesaNota_AfterInitialize(object sender, RoutedEventArgs e)
        {
            this.ShowUserWaitingProcess();
            this.cadastroDespesaNotaPresenter.Inicializar();
            this.HideUserWaitingProcess();
        }

        public void AtualizarTipoDespesa()
        {
            dtgTipodespesa.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);            
        }

        public void AtualizarListaEventoContabil()
        { 
            SinacorComboBox cmbListaEventoContabil = null;
             
            if (this.dtgDespesasNota.IsInserting)
            {
                // Inclusão, capturando combo
                cmbListaEventoContabil = (SinacorComboBox)ControlHelper.FindChild(this.dtgDespesasNota.GetInsertionRow(), "cmbEventoContabil");
            }
            else if (this.dtgDespesasNota.IsUpdating)
            {
                // Alteração, capturando combo
                cmbListaEventoContabil = (SinacorComboBox)ControlHelper.FindChild(this.dtgDespesasNota.GetEditRow(), "cmbEventoContabil");
            }

            if (cmbListaEventoContabil != null)
            {
                cmbListaEventoContabil.ItemsSource = this.cadastroDespesaNotaPresenter.ListaEventosContabeis;
                cmbListaEventoContabil.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            }

            if (this.dtgDespesasNota.IsUpdating)
            {
                cmbListaEventoContabil.SelectedValue = ((Model.DespesaNota)this.dtgDespesasNota.EditItem).EventoContabil;
            }

            if (this.dtgDespesasNota.IsInserting)
            {
                cmbListaEventoContabil.SelectedValue = ((Model.DespesaNota)this.dtgDespesasNota.EditItem).EventoContabil;
            }
        }
        
        public void AtualizarDespesaNota()
        {
            dtgDespesasNota.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        private void dtgTipodespesa_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtgTipodespesa.SelectedItem != null)
            {
                this.ShowUserWaitingProcess();
                Model.Parameter.FiltroDespesaNota _filtro = new Sinacor.UI.Bovespa.Contabil.Model.Parameter.FiltroDespesaNota();
                Model.TipoDespesa _tipoSelecionado = dtgTipodespesa.SelectedItem as Model.TipoDespesa;

                _filtro.Codigo = _tipoSelecionado.Codigo;
                this.cadastroDespesaNotaPresenter.ConsultarDespesasNota(_filtro);
                this.HideUserWaitingProcess();
                this.ClearServiceErrors();

                dtgDespesasNota.AllowBeginInsert = true;
                dtgDespesasNota.AllowBeginUpdate = true;
                dtgDespesasNota.AllowDelete = true;

                dtgDespesasNota.IsEnabled = true;

                AtribuirFocoDescricaoTipoDespesa();
            }
            else
            {
                LimparGridDespesaNota();

                dtgDespesasNota.AllowBeginInsert = false;
                dtgDespesasNota.AllowBeginUpdate = false;
                dtgDespesasNota.AllowDelete = false;

                dtgDespesasNota.IsEnabled = false;
            }
        }

        public void InformarSelecioneTipoDespesa()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.SelecioneTipoDespesaExcluido").ToString(), SinacorMessageBoxImage.Exclamation);
        }

        public bool ConfirmarExclusaoTipoDespesa()
        {
            if (SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.DesejaExcluirTipoDespesa").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Exclamation) == SinacorMessageBoxResult.Yes)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public void AtualizarListaBaseDespesa()
        {
            SinacorComboBox cmbListaBaseDespesa = null;
             
            if (this.dtgDespesasNota.IsInserting)
            {
                // Inclusão, capturando combo
                cmbListaBaseDespesa = (SinacorComboBox)ControlHelper.FindChild(this.dtgDespesasNota.GetInsertionRow(), "cmbBaseDespesa");
            }
            else if (this.dtgDespesasNota.IsUpdating)
            {
                // Alteração, capturando combo
                cmbListaBaseDespesa = (SinacorComboBox)ControlHelper.FindChild(this.dtgDespesasNota.GetEditRow(), "cmbBaseDespesa");
            }

            if (cmbListaBaseDespesa != null)
            {
                //cmbListaBaseDespesa.ItemsSource = this.cadastroDespesaNotaPresenter.TipoBaseDespesa;
                cmbListaBaseDespesa.UpdateTarget(SinacorComboBox.ItemsSourceProperty);
            }

            // Verifica se é uma alteração
            if (this.dtgDespesasNota.IsUpdating)
            {
                cmbListaBaseDespesa.SelectedValue = ((Model.DespesaNota)this.dtgDespesasNota.EditItem).BaseDespesa;
            }
        }

        private void dtgTipodespesa_Deleting(object sender, CancelItemsEventArgs e)
        {
            this.ClearServiceErrors();

            e.Cancel = true;
            e.Handled = true;
            
            if (dtgTipodespesa.SelectedItem != null)
            {
                if (this.cadastroDespesaNotaPresenter.ExcluirTipoDespesa(dtgTipodespesa.SelectedItem as Model.TipoDespesa))
                {                        
                    this.ShowUserWaitingProcess();
                    this.cadastroDespesaNotaPresenter.ConsultarTiposDespesasPeriodo();
                    this.AtualizarTipoDespesa();
                    this.HideUserWaitingProcess();
                }
            }
            else
            {
                this.InformarSelecioneTipoDespesa();                
            }
        }

        private void dtgTipodespesa_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgTipodespesa.GetInsertionRow() != null)
                {
                    this.ClearServiceErrors();

                    this.ShowUserWaitingProcess();

                    if (!this.cadastroDespesaNotaPresenter.IncluirTipoDespesa(dtgTipodespesa.EditItem as Model.TipoDespesa))
                    {
                        e.Cancel = true;
                        e.Handled = true;
                    }
                    else
                    {
                        this.ClearChanges();
                    }

                    this.HideUserWaitingProcess();
                }
            }
        }
        
        public void InformarDescricaoTipoDespesaObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.DescricaoTipoDespesaObrigatoria").ToString(), SinacorMessageBoxButton.Ok,SinacorMessageBoxImage.Exclamation);
            txtDescricao.Focus();
        }

        public void InformarNenhumRegistroEncontrado()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.PesquisaSemDados").ToString(), SinacorMessageBoxButton.Ok, SinacorMessageBoxImage.Exclamation);
        }

        private void dtgTipodespesa_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgTipodespesa.GetCurrentRow() != null)
                {
                    this.ClearServiceErrors();

                    this.ShowUserWaitingProcess();

                    if (!this.cadastroDespesaNotaPresenter.AlterarTipoDespesa(dtgTipodespesa.EditItem as Model.TipoDespesa))
                    {
                        e.Cancel = true;
                        e.Handled = true;
                    }
                    else
                    {
                        this.ClearChanges();
                    }
                    
                    this.HideUserWaitingProcess();
                }
            }
        }

        

        public bool ConfirmarExclusaoDespesa()
        {
            if (SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.DesejaExcluirDespesa").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Exclamation) == SinacorMessageBoxResult.Yes)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool ConfirmarExistemOperacoesNaoSalvas()
        {
            throw new NotImplementedException();
        }

        public bool ConfirmarPermiteAjuste()
        {
            if (SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.ConflitoDespesa").ToString(), SinacorMessageBoxButton.YesNo, SinacorMessageBoxImage.Exclamation) == SinacorMessageBoxResult.Yes)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public void InformarBaseDespesaObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.BaseDespesaObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[5].Focus();
        }

        public void InformarCodigoTipoDespesaObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.CodigoTipoDespesaObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
        }

        public void InformarConflitoSemAjuste()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.DuplicidadeValidade").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[0].Focus();
        }

        public void InformarDespesaAlteradaSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.DespesaAlteradaSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarDespesaIncluidaSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.DespesaIncluidaSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarDespesaObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.TipoDespesaObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
        }

        public void InformarEventoNaoPermitido()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.EventoNaoPermitido").ToString(), SinacorMessageBoxImage.Exclamation);
        }

        public void InformarExclusaoDespesaSucesso()
        { 
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.DespesaExcluidoSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarExclusaoTipoDespesaSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.TipoDespesaExcluidoSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarPercentualObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.PorcentagemObrigatoria").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[2].Focus();
        }

        public void InformarPregaoFinalObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.PregaoFinalObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[1].Focus();
        }

        public void InformarPregaoInicialInvalido()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.PregaoInicialInvalido").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[0].Focus();
        }

        public void InformarPregaoInicialObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.PregaoInicialObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[0].Focus();
        }

        public void InformarSelecioneDespesa()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.SelecioneDespesaExcluida").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[5].Focus();
        }

        public void InformarTipoDespesaAlteradoSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.TipoDespesaAlteradoSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarTipoDespesaIncluidoSucesso()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.Message.TipoDespesaIncluidoSucesso").ToString(), SinacorMessageBoxImage.Information);
        }

        public void InformarValorMaximoNaoPermitido()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.ValorMaximoNaoPermitido").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[4].Focus();
        }

        public void InformarValorMaximoObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.ValorMaximoObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[4].Focus();
        }

        public void InformarValorMinimoInvalido()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.ValorMinimoInvalido").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[3].Focus();
        }

        public void InformarValorMinimoNaoPermitido()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.ValorMinimoNaoPermitido").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[3].Focus();
        }

        public void InformarValorMinimoObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.ValorMinimoObrigatorio").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[3].Focus();
        }

        public void InformarEventoContabilObrigatorio()
        {
            SinacorMessageBox.Show(FindResource("Bovespa.Contabil.ExceptionMessage.InformeEventoContabil").ToString(), SinacorMessageBoxImage.Exclamation);
            dtgDespesasNota.GetCurrentRow().Cells[7].Focus();
        }


        public void ValidarTipoDespesa()
        {
            throw new NotImplementedException();
        }

        private void dtgTipodespesa_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (dtgDespesasNota.GetInsertionRow() != null)
            {
                if (dtgTipodespesa.SelectedItem != null)
                {
                    AtribuirFocoDescricaoTipoDespesa();
                }
            }
        }

        private void dtgDespesasNota_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgDespesasNota.GetInsertionRow() != null)
                {
                    this.ClearServiceErrors();

                    this.ShowUserWaitingProcess();                    
                    
                    (dtgDespesasNota.EditItem as Model.DespesaNota).Codigo = (dtgTipodespesa.SelectedItem as Model.TipoDespesa).Codigo;

                    if (this.cadastroDespesaNotaPresenter.IncluirDespesaNota(dtgDespesasNota.EditItem as Model.DespesaNota))
                    {
                        this.ClearChanges();
                        e.Cancel = true;
                        e.Handled = true;

                        Model.Parameter.FiltroDespesaNota _filtro = new Sinacor.UI.Bovespa.Contabil.Model.Parameter.FiltroDespesaNota();
                        _filtro.Codigo = (dtgTipodespesa.SelectedItem as Model.TipoDespesa).Codigo;
                        this.cadastroDespesaNotaPresenter.ConsultarDespesasNota(_filtro);
                    }
                    else
                    {
                        e.Cancel = true;
                        e.Handled = true;
                    }

                    this.HideUserWaitingProcess();
                }
            }

        }

        private void dtgDespesasNota_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (dtgDespesasNota.GetCurrentRow() != null)
                {
                    this.ClearServiceErrors();

                    this.ShowUserWaitingProcess();

                    string  codigoTipoDespesa = (dtgDespesasNota.EditItem as Model.DespesaNota).Codigo;

                    if (this.cadastroDespesaNotaPresenter.AlterarDespesaNota(dtgDespesasNota.EditItem as Model.DespesaNota))
                    {
                        this.ClearChanges();
                        e.Cancel = true;
                        e.Handled = true;

                        Model.Parameter.FiltroDespesaNota _filtro = new Sinacor.UI.Bovespa.Contabil.Model.Parameter.FiltroDespesaNota();
                        _filtro.Codigo = codigoTipoDespesa;
                        this.cadastroDespesaNotaPresenter.ConsultarDespesasNota(_filtro);
                        this.AtualizarDespesaNota();
                    }
                    else
                    {
                        e.Cancel = true;
                        e.Handled = true;                    
                    }

                    this.HideUserWaitingProcess();
                }
            }
        }

        private void dtgDespesasNota_Deleting(object sender, CancelItemsEventArgs e)
        {
            this.ClearServiceErrors();

            e.Cancel = true;
            e.Handled = true;

            if (dtgDespesasNota.SelectedItem != null)
            {
                string codigoTipoDespesa = (dtgDespesasNota.SelectedItem as Model.DespesaNota).Codigo;

                if (this.cadastroDespesaNotaPresenter.ExcluirDespesaNota(dtgDespesasNota.SelectedItem as Model.DespesaNota))
                {
                    this.ShowUserWaitingProcess();
                    Model.Parameter.FiltroDespesaNota _filtro = new Sinacor.UI.Bovespa.Contabil.Model.Parameter.FiltroDespesaNota();
                    _filtro.Codigo = codigoTipoDespesa;
                    this.cadastroDespesaNotaPresenter.ConsultarDespesasNota(_filtro);
                    this.AtualizarDespesaNota();
                    this.HideUserWaitingProcess();
                }
            }
            else
            {
                this.InformarSelecioneDespesa();
            }
        }

        private void btnPesquisar_Click(object sender, RoutedEventArgs e)
        {
            LimparGrids();
            this.cadastroDespesaNotaPresenter.ConsultarTiposDespesasPeriodo();
        }

        private void botaoNovaPesquisa_Click(object sender, RoutedEventArgs e)
        {
            //txtCodigo.Clear();
            //txtDescricao.Clear();
            //txtPregaoInicial.Value = null;
            //txtPregaoFinal.Value = null;

            if (cadastroDespesaNotaPresenter.FiltroTipoDespesaPeriodo != null)
            {
                cadastroDespesaNotaPresenter.FiltroTipoDespesaPeriodo.Codigo = string.Empty;
                cadastroDespesaNotaPresenter.FiltroTipoDespesaPeriodo.Descricao = string.Empty;
                cadastroDespesaNotaPresenter.FiltroTipoDespesaPeriodo.PregaoFinal = null;
                cadastroDespesaNotaPresenter.FiltroTipoDespesaPeriodo.PregaoInicial = null;
            }

            LimparGrids();

            txtCodigo.Focus();
        }

        private void LimparGrids()
        {
            cadastroDespesaNotaPresenter.ListaTipoDespesa = new Sinacor.Infra.UI.Common.ModelCollection<Sinacor.UI.Bovespa.Contabil.Model.TipoDespesa>();
            AtualizarTipoDespesa();

            LimparGridDespesaNota();
        }

        private void LimparGridDespesaNota()
        {
            cadastroDespesaNotaPresenter.ListaDespesaNota = new Sinacor.Infra.UI.Common.ModelCollection<Sinacor.UI.Bovespa.Contabil.Model.DespesaNota>();
            AtualizarDespesaNota();        
        }


        public void AtribuirFocoCodigoTipoDespesa()
        {
            dtgTipodespesa.GetCurrentRow().Cells[0].Focus();
        }

        public void AtribuirFocoDescricaoTipoDespesa()
        {
            dtgTipodespesa.GetCurrentRow().Cells[1].Focus();
        }


        public void AtribuirFocoPregaoInicialDespesa()
        {
            dtgDespesasNota.GetCurrentRow().Cells[0].Focus();
        }

        private void dtgDespesasNota_InsertEnded(object sender, ItemEventArgs e)
        {

        }
    }
}
